#include "bsp_serial.h"
#include "cmsis_os.h"
#include "bsp_log.h"
xComPortHandle xSerialPortInitMinimal(uint32_t configCLI_BAUD_RATE, uint32_t cmdQUEUE_LENGTH)
{
    xComPortHandle uart_unit;
    MEM_ZERO_STRUCT(uart_unit);
    uart_unit.uart_cfg.Baudrate = 115200;
    uart_unit.uart_cfg.RTO_enable = Enable;
    uart_unit.uart_cfg.rxPort = USART3_RX_PORT;
    uart_unit.uart_cfg.rxPin = USART3_RX_PIN;
    uart_unit.uart_cfg.rxfunc = USART3_RX_FUNC;
    uart_unit.uart_cfg.txPort = USART3_TX_PORT;
    uart_unit.uart_cfg.txPin = USART3_TX_PIN;
    uart_unit.uart_cfg.txfunc = USART3_TX_FUNC;
    uart_unit.uart_cfg.stcUartConf.enClkMode = UsartIntClkCkNoOutput;
    uart_unit.uart_cfg.stcUartConf.enDataLength = UsartDataBits8;
    uart_unit.uart_cfg.stcUartConf.enDirection = UsartDataLsbFirst;
    uart_unit.uart_cfg.stcUartConf.enParity = UsartParityNone;
    uart_unit.uart_cfg.stcUartConf.enStopBit = UsartOneStopBit;
    uart_unit.uart_cfg.stcUartConf.enSampleMode = UsartSampleBit8;
    uart_unit.uart_cfg.stcUartConf.enDetectMode = UsartStartBitFallEdge;
    uart_unit.uart_cfg.stcUartConf.enClkDiv = UsartClkDiv_1;
    uart_unit.UART_UNIT = M4_USART3;
    bsp_uart_init(uart_unit.UART_UNIT,&uart_unit.uart_cfg);
//    Ddl_UartInit();
    return uart_unit;
}
void xSerialPutChar(xComPortHandle xPort, uint8_t cRxedChar, uint32_t timeout)
{
    uint32_t tick;
    tick = SysTick_GetTick();
    while(USART_GetStatus(xPort.UART_UNIT,UsartTxEmpty) == 0)
    {
        if(SysTick_GetTick()-tick > 10)
        {
                return;
        }
    }
    USART_SendData(xPort.UART_UNIT,cRxedChar);
}
void vSerialPutString(xComPortHandle xPort, signed char * xstring, unsigned short strlen )
{
    uint32_t tick;
    tick = SysTick_GetTick();
    LOG("%s",xstring);
    do{
        while(USART_GetStatus(xPort.UART_UNIT,UsartTxEmpty) == 0)
        {
            if(SysTick_GetTick()-tick > 10)
            {
                return;
            }
        }
        USART_SendData(xPort.UART_UNIT,*xstring);
        xstring++;
    }while(*xstring != '\0');
}

int xSerialGetChar(xComPortHandle xPort, signed char * xstring, uint32_t timeout)
{
    int ch = -1;
    if(USART_GetStatus(xPort.UART_UNIT, UsartRxNoEmpty) != Reset)
    {
        LOG_INFO("USART_GetStatus");
        ch = USART_RecData(xPort.UART_UNIT);
        *xstring = ch;
        LOG("%x",ch);
    }
    else
    {
        if(USART_GetStatus(xPort.UART_UNIT, UsartOverrunErr) != Reset)
        {
            USART_ClearStatus(xPort.UART_UNIT,UsartOverrunErr);
        }
        vTaskDelay(10/portTICK_PERIOD_MS);
    }
    return Ok;
}    
